package com.atguigu.srb.oss.service.impl;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.PutObjectRequest;
import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.srb.oss.service.FileService;
import com.atguigu.srb.oss.util.FileProperties;
import org.joda.time.DateTime;

import java.io.InputStream;
import java.util.UUID;

//@Service
@Deprecated
public class FileServiceImpl implements FileService {

    @Override
    public String upload(InputStream inputStream, String module, String fileName) {
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = FileProperties.ENDPOINT;
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = FileProperties.ACCESS_KEY_ID;
        String accessKeySecret = FileProperties.ACCESS_KEY_SECRET;

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            if (!ossClient.doesBucketExist(FileProperties.BUCKET_NAME)) {
                ossClient.createBucket(FileProperties.BUCKET_NAME);
                ossClient.setBucketAcl(FileProperties.BUCKET_NAME, CannedAccessControlList.PublicRead);
            }
        } catch (OSSException | ClientException e) {
            throw new BusinessException(e, ResponseEnum.UPLOAD_ERROR);
        }

        // 创建PutObjectRequest对象。
        // 依次填写Bucket名称（例如examplebucket）、Object完整路径（例如exampledir/exampleobject.txt）和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
        // 文件目录结构 "avatar/2022/01/10/uuid.jpg"
        String timeFolder = new DateTime().toString("/yyyy/MM/dd/");
        fileName = UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."));
        String key = module + timeFolder + fileName;
        PutObjectRequest putObjectRequest = new PutObjectRequest(FileProperties.BUCKET_NAME, key, inputStream);

        // 如果需要上传时设置存储类型和访问权限，请参考以下示例代码。
        // ObjectMetadata metadata = new ObjectMetadata();
        // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        // metadata.setObjectAcl(CannedAccessControlList.Private);
        // putObjectRequest.setMetadata(metadata);

        // 上传文件。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
        return "https://" + FileProperties.BUCKET_NAME + "." + FileProperties.ENDPOINT + "/" + key;
    }

    @Override
    public void removeFile(String url) {
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = FileProperties.ENDPOINT;
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = FileProperties.ACCESS_KEY_ID;
        String accessKeySecret = FileProperties.ACCESS_KEY_SECRET;

        // 填写文件完整路径。文件完整路径中不能包含Bucket名称。
        // test/2022/01/10/3ed062b1-b688-4ab4-a7fc-2bfce6978ed0.jpg
        String hostName= "https://" + FileProperties.BUCKET_NAME + "." + FileProperties.ENDPOINT + "/";
        String objectName = url.substring(hostName.length());

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 删除文件或目录。如果要删除目录，目录必须为空。
        ossClient.deleteObject(FileProperties.BUCKET_NAME, objectName);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}
